// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_BASE_PROXY_DELEGATE_H_
#define NET_BASE_PROXY_DELEGATE_H_

#include <string>

#include "base/macros.h"
#include "net/base/net_export.h"

class GURL;

namespace net {

class HttpRequestHeaders;
class HttpResponseHeaders;
class HostPortPair;
class ProxyInfo;
class ProxyServer;
class ProxyService;
class URLRequest;

// Delegate for setting up a connection.
class NET_EXPORT ProxyDelegate {
public:
    ProxyDelegate()
    {
    }

    virtual ~ProxyDelegate()
    {
    }

    // Called as the proxy is being resolved for |url| for a |method| request.
    // The caller may pass an empty string to get method agnostic resoulution.
    // Allows the delegate to override the proxy resolution decision made by
    // ProxyService. The delegate may override the decision by modifying the
    // ProxyInfo |result|.
    virtual void OnResolveProxy(const GURL& url,
        const std::string& method,
        int load_flags,
        const ProxyService& proxy_service,
        ProxyInfo* result)
        = 0;

    // Called when use of |bad_proxy| fails due to |net_error|. |net_error| is
    // the network error encountered, if any, and OK if the fallback was
    // for a reason other than a network error (e.g. the proxy service was
    // explicitly directed to skip a proxy).
    virtual void OnFallback(const ProxyServer& bad_proxy,
        int net_error)
        = 0;

    // Called immediately before a proxy tunnel request is sent.
    // Provides the embedder an opportunity to add extra request headers.
    virtual void OnBeforeTunnelRequest(const HostPortPair& proxy_server,
        HttpRequestHeaders* extra_headers)
        = 0;

    // Called when the connect attempt to a CONNECT proxy has completed.
    virtual void OnTunnelConnectCompleted(const HostPortPair& endpoint,
        const HostPortPair& proxy_server,
        int net_error)
        = 0;

    // Called after the response headers for the tunnel request are received.
    virtual void OnTunnelHeadersReceived(
        const HostPortPair& origin,
        const HostPortPair& proxy_server,
        const HttpResponseHeaders& response_headers)
        = 0;

    // Returns true if |proxy_server| is a trusted SPDY/HTTP2 proxy that is
    // allowed to push cross-origin resources.
    virtual bool IsTrustedSpdyProxy(const net::ProxyServer& proxy_server) = 0;

private:
    DISALLOW_COPY_AND_ASSIGN(ProxyDelegate);
};

}

#endif // NET_BASE_PROXY_DELEGATE_H_
